iT邦幫忙

2024 iThome 鐵人賽

DAY 2
0
佛心分享-刷題不只是刷題

Leecode刷題系列 第 4

D5:Q22Generate Parentheses

  • 分享至 

  • xImage
  •  

這題要我生成所有合理的括號組合,就是要考我 遞迴(backtracking) 的能力,我要先知道題目要我尬麻?
我需要先生成 n 對括號的所有合法組合,合法括號組合是每個左括號 ( 都有對應的右括號 ) ,且在生成過程中,不能讓右括號比左括號多。

例如: n = 3 ,有五種合法的括號組合:
((()))
(()())
(())()
()(())
()()()
想法:
這是迴和回溯(backtracking) 問題,要一步步生成括號,生成的過程要保證合理性。
步驟:
決策樹模型 ; 生成括號可以想成是一個決策過程,對每個位置,可以選擇放 左括( 或右括 ),但有兩個限制,左括號 ( 數不能多餘 n,因為就只有 n 對括號,任何情況,右括號 ) 的量不能超過左括號,因為這樣的括號組合無效,狀態遞迴,用遞迴的方式,一步步生成括號,如果左括號數量少於 n ,可以選擇加入左括號 (,如果右括號數量少於左括號,可以加入右括號 ),當生成的括號數量到達2n(因為有 n 對括號),這樣就完成了一個合理的組合,接著遞迴 ; 初始條件,一開始,有 n 對括號要生成,所以設 left = n 和 right = n,分別表示還能放多少左括和右括,遞迴條件,
如果還有左括號可放 (left > 0),就遞迴放一個左括號,再減少 left,如果右括號的數少於左括號的數 (right > left),就可放右括號,然後減少 right,終止條件,左右括號都用完,就能得到一個合理的括號組合。
技巧:
遞迴回溯,是生成所有可能組合的典型方式。對每個位置,遞迴的兩個分支是選放左括或右括,最終在每個遞迴分支結束進行回溯,以此再其他可能的組合,合理性檢查,每次遞迴,要確保放入的右括號不會比左括號多,這樣生成的組合就會保持合理,時間複雜度,這題的複雜度是 O(4^n / sqrt(n)),因為這是 Catalan 數列問題,核心就是用 遞迴和回溯,並時刻檢查生成過程中的合理性,在處理括號生成,透過狀態變量(left 和 right)控制括號數。

程式碼:
class Solution(object):
def generateParenthesis(self, n):
"""
:type n: int
:rtype: List[str]
"""
result = []

    def backtrack(current, open_count, close_count):
        # 如果達到了 n 對括號的目標
        if len(current) == 2 * n:
            result.append(current)
            return
        
        #如果還能加入左括號
        if open_count < n:
            backtrack(current + "(", open_count + 1, close_count)
        
        #如果能加入右括號
        if close_count < open_count:
            backtrack(current + ")", open_count, close_count + 1)
    
    #開始回溯
    backtrack("", 0, 0)
    return result

https://ithelp.ithome.com.tw/upload/images/20240919/20169309WlJJ8sIYbk.png


上一篇
D4:Q16
下一篇
D6:Q24Swap Nodes in Pairs
系列文
Leecode刷題10
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言